﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace INSTA.BankSystem.BLL
{
    /// <summary>
    /// Represents the Bank.
    /// </summary>
    public class Bank
    {
        private List<AccountBase> _accounts;
        

        #region -- Singleton Implementation

        private static Bank _instance = null;

        /// <summary>
        /// Constructeur privé inacessible depuis 
        /// l'extérieur de la classse.
        /// </summary>
        private Bank()
        {
            // On instancie la liste de comptes.
            _accounts = new List<AccountBase>();

        }

        /// <summary>
        /// Gets the unique instance.
        /// </summary>
        /// <returns>the unique instance.</returns>
        public static Bank GetInstance()
        {
            // Si c'est le 1er appel à cette méthode..
            if (_instance == null)
            {
                // On crée l'instance unique en appelant
                // le constructeur privé.
                _instance = new Bank();
            }

            // et l'on renvoie l'instance précédemment créée.
            return _instance;
        }



        #endregion



        /**********************************************************************
         * Methods
         **********************************************************************/


        public AccountBase Create(Customer customer, double deposit)
        {
            AccountBase account;

            // On crée le compte via la Factory..
            account = AccountFactory.Create(customer, deposit);

            // On ajoute le compte à la liste des comptes 
            // de la banque
            Accounts.Add( account  );

            return account;
        }
        
        
        /**********************************************************************
         * Properties
         **********************************************************************/
       
 
        /// <summary>
        /// Gets or sets the country.
        /// </summary>
        public string Country { get; set; }


        /// <summary>
        /// Gets the accounts.
        /// </summary>
        public List<AccountBase> Accounts
        {
            get { return _accounts; }
        } 
    }
}
